/*
    在js中，共有2种作用域：全局作用域和函数作用域（局部）
    1.全局作用域：
        直接编写在script标签中的JS代码，都在全局作用域
        全局作用域在页面打开时创建，在页面关闭时销毁
        全局对象：window，它代表的是浏览器的窗口，由浏览器创建，可以直接使用

    2.函数作用域：
        在函数中的代码块
        调用函数时创建函数作用域，函数执行完毕以后，函数作用域销毁
        当在函数作用域操作一个变量时，它会先在自身作用域中寻找，
            ● 如果有就直接使用
            ● 如果没有则向上一级作用域中寻找，直到找到全局作用域
            ● 如果全局作用域中依然没有找到，则会报错
        在函数中要访问全局变量可以使用window对象

*/ 

// 用关键字var定义的变量会存在声明提前
var a = 3;
console.log(a);  // 3
// console.log(window.a);  // 3

// 不用var关键字来定义变量，那么定义的不良就是全局变量，也不会存在声明提前
b = 4;  
console.log(b);

function fun1(e) {
    // 在函数中定义形参就相当于用var关键字声明了一个变量
    // var e;
    console.log(e);
}
fun1();  // 没有传入具体的参数，所以是undefined
fun1(3);


console.log("==============================");
console.log("==============================");
console.log("============ 练习 ============");

// 直接运行的话，结果是错的，因为定义了多个同名变量
var a = 123;
function fun() {
    console.log(a);
}
fun();  // 123

var a = 123;
function fun() {
    console.log(a);  // 函数作用域中有a，那就从函数作用域中找，如果没有，那么就从全局作用域中找
    var a = 456;  // 用var的话，表示是局部的
}
fun();  // 456 

var a = 123;
function fun() {
    console.log(a);  // 123
    a = 456;  // 不用var的话，表示是全局的
}
fun();  // 123
console.log(a);  // 456

var a = 123; 
function fun(a){
    // 定义形参就相当于用var在函数中声明变量，但是在调用的时候没有传入参数
    // var a;
    console.log(a);
    a = 456;  // 由于上面用var声明了a，所以这里的a是局部的a
}
fun();      // 没有传入参数，所以是undefined
console.log(a);  // 123

var a = 123; 
function fun(a){
    // 定义了形参，在调用的时候也传入了参数
    // var a = 789;
    console.log(a);
    a = 456;  // 这个a也是局部的a
}
fun(789);   // 789
console.log(a);  // 123
